/* ==================================================================   
 * Created [2009-4-27 下午11:32:55] by Jon.King 
 * ==================================================================  
 * TSS 
 * ================================================================== 
 * mailTo:jinpujun@hotmail.com
 * Copyright (c) Jon.King, 2009-2012 
 * ================================================================== 
*/

package com.jinhe.tss.core.cachepool.threadpool;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import com.jinhe.tss.core.cachepool.CacheManager;
import com.jinhe.tss.core.cachepool.Cacheable;
import com.jinhe.tss.core.cachepool.IPool;
import com.jinhe.tss.core.cachepool.TestCacheConstants;
import com.jinhe.tss.core.cachepool.extend.thread.IThreadPool;
import com.jinhe.tss.core.cachepool.proxy.profier.CGLIBProfiler;
import com.jinhe.tss.core.cachepool.proxy.profier.ProxyProfiler;
import com.jinhe.tss.core.cachepool.strategy.CacheConstants;

/** 
 * <p> PortScanner.java </p> 
 * 
 * 本测试类中因为Scanner的对象很小，从缓存中获取或是直接new 出来，差别并不大， </p><p>
 * 所以尝试增长Scanner对象的生成时间，构造函数里 sleep（n）。 </p><p>
 * 用CGLIBProfiler来测试fillInWorkQueue方法在上述两种不同情况下的效率。 </p><p>
 * 池的关闭在缓存策略配置文件中设置，disabled（0：启用， 1：停用）。 </p><p>
 * 另外性能调优还要考虑 "线程池" 方面。
 * 
 *  @author Jon.King 2007-1-8
 */

public class PortScanner {
    public static void main(String[] args) {
        
        testPool();
        
        testPoolPerformance();
    }
    
    protected static Logger log = Logger.getLogger(PortScanner.class);
    
    static IPool apool;
    static IThreadPool tpool;
    
    public PortScanner(){
        CacheManager manager = CacheManager.getInstance(TestCacheConstants.STRATEGY_PATH);
        apool = manager.getCachePool(CacheConstants.ASSIMENT_POOL);
        tpool = (IThreadPool) manager.getCachePool(CacheConstants.THREAD_POOL);
        
        try {// 休眠6s，等待池初始化结束
            Thread.sleep(6000);
        } catch (InterruptedException e) {
        }
    }
    
    /**
     * 测试池机制。</p><p>
     * 包括ReusablePool的checkout，checkIn等操作 和 ThreadPool的机制（包括worker池和work队列）
     */
    public static void testPool(){
        Logger.getRootLogger().setLevel(Level.DEBUG);
        
        PortScanner ps = new PortScanner();        
        ps.fillInWorkQueue(12, 28);
    }
    
    /**
     * 测试池的性能。</p><p>
     * 测试fillInWorkQueue()方法的执行时间，和每次checkOut的执行时间。</p><p>
     * 
     * 分别以CGLIBProfiler来测试普通对象方法执行时间</p><p>
     * 和利用ProxyProfiler来测试实现接口的对象方法执行时间。</p><p>
     * 
     * 任务池的开关在缓存策略配置文件中设置，disabled（0：启用， 1：停用），比较两种状态下的性能。
     */
    public static void testPoolPerformance(){
        Logger.getRootLogger().setLevel(Level.INFO);
        
        PortScanner ps = (PortScanner) new CGLIBProfiler().getProxy(PortScanner.class);
        apool = (IPool) ProxyProfiler.frofiler(apool, new String[]{"checkOut"});
        
        ps.fillInWorkQueue(1, 1000);
    }
    
    public void fillInWorkQueue(int beginport,  int endport){
        String host = "127.0.0.1";
        
        for (int i = beginport; i <= endport; i++) {
            Cacheable o = apool.checkOut(apool.getCacheStrategy().getInterruptTime().longValue());
            
            _Scanner s = (_Scanner) o.getValue();
            s.setHost(host);
            s.setPort(i);

            tpool.excute(apool, o);
        }
        log.debug("工作队列填充完毕！工填充了 " + (endport - beginport) + "个任务。");
        
        while(true){
            try {// 休眠130s，等待池中对象都过期后
                Thread.sleep(130000);
            } catch (InterruptedException e) {
            }
            log.debug("－－－－－－－－－－－－－－－－－－130s等待结束－－－－－－－－－－－－－－－");
            //测试checkIn事件是否重新唤醒apool池的cleaner线程
            Cacheable o = apool.checkOut(100);
            _Scanner s = (_Scanner) o.getValue();
            s.setHost(host);
            s.setPort(12);
            tpool.excute(apool, o);
        }
    }
}


